001 /** 002 * Copyright 2003-2004 The Apache Software Foundation 003 * Copyright 2005 Stephen McConnell 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package net.dpml.cli.option; 018 019 import java.util.Comparator; 020 import java.util.Set; 021 022 import net.dpml.cli.HelpLine; 023 import net.dpml.cli.Option; 024 025 /** 026 * Represents a line in the help screen. 027 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 028 * @version 1.0.0 029 */ 030 public class HelpLineImpl implements HelpLine 031 { 032 /** The option that this HelpLineImpl describes */ 033 private final Option m_option; 034 035 /** The level of indenting for this item */ 036 private final int m_indent; 037 038 /** The help settings used to obtain the previous usage */ 039 private transient Set m_cachedHelpSettings; 040 041 /** The comparator used to obtain the previous usage */ 042 private transient Comparator m_cachedComparator; 043 044 /** The previously obtained usage */ 045 private transient String m_cachedUsage; 046 047 /** 048 * Creates a new HelpLineImpl to represent a particular Option in the online 049 * help. 050 * 051 * @param option the Option that the HelpLineImpl describes 052 * @param indent the level of indentation for this line 053 */ 054 public HelpLineImpl( final Option option, final int indent ) 055 { 056 m_option = option; 057 m_indent = indent; 058 } 059 060 /** 061 * @return The description of the option 062 */ 063 public String getDescription() 064 { 065 return m_option.getDescription(); 066 } 067 068 /** 069 * @return The level of indentation for this line 070 */ 071 public int getIndent() 072 { 073 return m_indent; 074 } 075 076 /** 077 * @return The Option that the help line relates to 078 */ 079 public Option getOption() 080 { 081 return m_option; 082 } 083 084 /** 085 * Builds a usage string for the option using the specified settings and 086 * comparator. 087 * 088 * @param helpSettings the settings to apply 089 * @param comparator a comparator to sort options when applicable 090 * @return the usage string 091 */ 092 public String usage( final Set helpSettings, final Comparator comparator ) 093 { 094 if( m_cachedUsage == null 095 || m_cachedHelpSettings != helpSettings 096 || m_cachedComparator != comparator ) 097 { 098 099 // cache the arguments to avoid redoing work 100 m_cachedHelpSettings = helpSettings; 101 m_cachedComparator = comparator; 102 103 // build the new buffer 104 final StringBuffer buffer = new StringBuffer(); 105 for( int i = 0; i < m_indent; ++i ) 106 { 107 buffer.append( " " ); 108 } 109 m_option.appendUsage( buffer, helpSettings, comparator ); 110 111 // cache the usage string 112 m_cachedUsage = buffer.toString(); 113 } 114 return m_cachedUsage; 115 } 116 }